﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data;


namespace GestorDeFlotas.Core
{

    public class Auto
    {
        public int codigoAuto { get; set; }
        public int marcaCodigo { get; set; }
        public string marca { get; set; }
        public string modelo { get; set; }
        public bool esActivo { get; set; }        
        public string patente { get; set; }
        public string licencia { get; set; }
        public string rodado { get; set; }
        public Reloj reloj { get; set; }
        
        public int relojCodigo { get; set; }
        public String marcaReloj { get; set; }


        public Auto() { }

        public Auto(int codigoAuto)
        {
            this.codigoAuto = codigoAuto;

        }

        public Auto(int codigoAuto, Reloj unReloj) 
        {
            this.codigoAuto = codigoAuto;
            this.reloj = unReloj;
        }

        public Auto Cargar()
        {
            using (SqlConnection connection = SqlUtils.GetConnection())
            {
                string sql = string.Format("SELECT r.Auto_codigo,r.Auto_marca_codigo,m.marca_nombre,r.Auto_modelo,r.Auto_patente,r.Auto_licencia, r.Auto_rodado" +
                                           " FROM CRAZY_TAXI.TL_Autos r, CRAZY_TAXI.TL_Marcas_Autos m" +
                                           " WHERE r.Auto_marca_codigo = m.marca_codigo " +
                                           " AND r.Auto_codigo ={0}", this.codigoAuto);

                SqlCommand getCliente = SqlUtils.GetNewCommand(sql);
                getCliente.Connection = connection;
                getCliente.Connection.Open();
                SqlDataReader reader = getCliente.ExecuteReader();

                if (reader.HasRows)
                {
                    reader.Read();
                    this.codigoAuto = Convert.ToInt32(reader.GetInt32(0));
                    this.marcaCodigo = Convert.ToInt32(reader.GetInt32(1));
                    this.marca = reader.GetString(2);                    
                    this.modelo = reader.GetString(3);
                    this.patente = reader.GetString(4);
                    this.licencia = reader.GetString(5);
                    this.rodado = reader.GetString(6);
                }
                else
                {
                    throw new Exception(string.Format("No existe un Auto con código {0}.", this.codigoAuto));
                }

                reader.Close();
                return this;
            }
        }



        public void Crear()
        {
            using (SqlConnection connection = SqlUtils.GetConnection())
            {
                connection.Open();

                string sql = "INSERT INTO CRAZY_TAXI.TL_Autos (Auto_marca_codigo, Auto_modelo, auto_patente, auto_licencia, auto_rodado, auto_reloj_codigo, Auto_es_activo)" +
                             "VALUES (@marcaCodigo, @modelo, @patente, @licencia, @rodado, @relojCodigo, @esActivo)";

                SqlCommand crearAuto = SqlUtils.GetNewCommand(sql);

                SetearParametros(crearAuto);

                crearAuto.Connection = connection;
                crearAuto.ExecuteNonQuery();
            }


        }
        private void SetearParametros(SqlCommand sql)
        {
            SqlParameter paramMarcaCodigo = new SqlParameter("@marcaCodigo", SqlDbType.Int);
            paramMarcaCodigo.IsNullable = false;
            paramMarcaCodigo.Value = this.marcaCodigo;

            SqlParameter paramModelo = new SqlParameter("@modelo", SqlDbType.VarChar);
            paramModelo.IsNullable = false;
            paramModelo.Value = this.modelo;

            SqlParameter paramPatente = new SqlParameter("@patente", SqlDbType.VarChar);
            paramPatente.IsNullable = true;
            paramPatente.Value = this.patente;

            SqlParameter paramLicencia = new SqlParameter("@licencia", SqlDbType.VarChar);
            paramLicencia.IsNullable = false;
            paramLicencia.Value = this.licencia;


            SqlParameter paramRodado = new SqlParameter("@rodado", SqlDbType.VarChar);
            paramRodado.IsNullable = false;
            paramRodado.Value = this.rodado;

            SqlParameter paramRelojCodigo = new SqlParameter("@relojCodigo", SqlDbType.Int);
            paramRelojCodigo.IsNullable = false;
            paramRelojCodigo.Value = this.reloj.codigoReloj;

            SqlParameter paramActivo = new SqlParameter("@esActivo", SqlDbType.Bit);
            paramActivo.IsNullable = false;
            paramActivo.Value = 1;

            sql.Parameters.Add(paramMarcaCodigo);
            sql.Parameters.Add(paramModelo);
            sql.Parameters.Add(paramPatente);
            sql.Parameters.Add(paramLicencia);
            sql.Parameters.Add(paramRodado);
            sql.Parameters.Add(paramRelojCodigo);
            sql.Parameters.Add(paramActivo);
        }

        public void Modificar()
        {
            using (SqlConnection connection = SqlUtils.GetConnection())
            {
                connection.Open();
                SqlTransaction transaction = connection.BeginTransaction();

                try
                {
                    ModificarDatosCliente(connection, transaction);
                    transaction.Commit();
                }
                catch (Exception e)
                {
                    e.ToString();
                    transaction.Rollback();
                    
                    throw;
                }
            }
        }

        private void ModificarDatosCliente(SqlConnection connection, SqlTransaction transaction)
        {
            string sql = "UPDATE CRAZY_TAXI.TL_Autos SET  [auto_marca_codigo] = @marcaCodigo, [auto_modelo] = @modelo, [auto_patente] = @patente, [auto_reloj_codigo] = @relojCodigo, [auto_licencia] = @licencia, [Auto_es_activo]=@esActivo "
                + " WHERE [Auto_codigo] = @autoCodigo";
            SqlCommand modificarCliente = SqlUtils.GetNewCommand(sql);


            SqlParameter paramMarcaCodigo = new SqlParameter("@marcaCodigo", SqlDbType.Int);
            paramMarcaCodigo.IsNullable = false;
            paramMarcaCodigo.Value = this.marcaCodigo;

            SqlParameter paramModelo = new SqlParameter("@modelo", SqlDbType.VarChar);
            paramModelo.IsNullable = false;
            paramModelo.Value = this.modelo;

            SqlParameter paramPatente = new SqlParameter("@patente", SqlDbType.VarChar);
            paramPatente.IsNullable = true;
            paramPatente.Value = this.patente;

            SqlParameter paramLicencia = new SqlParameter("@licencia", SqlDbType.VarChar);
            paramLicencia.IsNullable = false;
            paramLicencia.Value = this.licencia;


            SqlParameter paramRodado = new SqlParameter("@rodado", SqlDbType.VarChar);
            paramRodado.IsNullable = false;
            paramRodado.Value = this.rodado;

            SqlParameter paramRelojCodigo = new SqlParameter("@relojCodigo", SqlDbType.Int);
            paramRelojCodigo.IsNullable = false;
            paramRelojCodigo.Value = this.reloj.codigoReloj;

            SqlParameter paramActivo = new SqlParameter("@esActivo", SqlDbType.Bit);
            paramActivo.IsNullable = false;
            paramActivo.Value = 1;

            SqlParameter paramCodigoAuto = new SqlParameter("@autoCodigo", SqlDbType.Int);
            paramCodigoAuto.IsNullable = false;
            paramCodigoAuto.Value = this.codigoAuto;


            modificarCliente.Parameters.Add(paramMarcaCodigo);
            modificarCliente.Parameters.Add(paramModelo);
            modificarCliente.Parameters.Add(paramPatente);
            modificarCliente.Parameters.Add(paramLicencia);
            modificarCliente.Parameters.Add(paramRodado);
            modificarCliente.Parameters.Add(paramRelojCodigo);
            modificarCliente.Parameters.Add(paramActivo);
            modificarCliente.Parameters.Add(paramCodigoAuto);
            modificarCliente.Connection = connection;
            modificarCliente.Transaction = transaction;
            modificarCliente.ExecuteNonQuery();
        }

        public void SetInactivo()
        {
            using (SqlConnection connection = SqlUtils.GetConnection())
            {
                string sql = "UPDATE CRAZY_TAXI.TL_Autos SET Auto_es_activo = 0 WHERE Auto_codigo = @Auto_codigo";

                // Codigo para borrar el rol de la base
                SqlCommand updateRecord = SqlUtils.GetNewCommand(sql);

                SqlParameter rowParameter = new SqlParameter("@Auto_codigo", SqlDbType.Int);
                rowParameter.IsNullable = false;
                rowParameter.Value = this.codigoAuto;

                updateRecord.Parameters.Add(rowParameter);
                updateRecord.Connection = connection;
                updateRecord.Connection.Open();
                updateRecord.ExecuteNonQuery();
            }
        }

    }
}
